surfaceFlinger 在init.rc中是作为一个service存在的它声明如下
1 | service surfaceflinger /system/bin/surfaceflinger |
从上面的内容可以看出,surfaceflinger所属的class为main,这和zygote时同级的。但它的启动并不需要带任何参数。同时由于surfaceflinger是service,说明它是单独的可执行程序,程序路径为/system/bin/surfaceflinger 运行在单独的进程里,另外,从最后一行也能看出sf重启时要重启zygote。
Surfaceflinger主程序对应的文件是frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp 所以我们从这个文件入手。
1 | int main(int argc, char** argv) { |
sf的主程序中做了以下事情:
1.初始binder的运行环境
2.创建Sf对象,并对其进行初始化
3.将Sf服务添加到ServiceManger中,以便向其他进程提供服务
4.SF在自己的线程中开始运行
SurfaceFlinger作为服务进程,必然需要通过Binder进行IPC通信,所以在一开始需要对Binder环境进行初始化。接着创建了SurfaceFlinger对象
1 | frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp |
构造方法很简单,只是都其成员进行初始化,读取一些配置信息,比如是否开启DDMS的调试。
接下来通过init方法对该对象进行初始化。这个初始化过程会做大量比较重要的工作。
1 | frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp |
在init方法中,sf做了以下的事:
1.为默认的显示设备初始EGL环境
2.创建合成对象
3.初始化所有的非虚拟显示设备
4.创建绘图延时Vysnc源 及 合成延时Vysnc源
1 | void MessageQueue::setEventThread(const sp<EventThread>& eventThread) |
需要注意的是在main方法中创建的SurfaceFlinger是个强引用对象,所以在第一次调用同时也会会触发onFirstRef方法,这个方法会对SF的mEventQueue成员进行初始化。它是一个MessageQueue对象,负责SF的消息管理。
1 | void SurfaceFlinger::onFirstRef() |
最后调用sf的run方法,这个方法会进入一个循环,不断等待消息的到来并进行处理
1 | void SurfaceFlinger::run() { |
SF的消息来源有两种,一个是Vsync信号,这是通过注册的cb_eventReceiver事件回调来处理的,另一种可能是应用进程或者说客户端的消息,比如创建Layer的请求,就是通过发送消息的方式来处理的。
1 | frameworks/native/services/surfaceflinger/Client.cpp |